package photoMethod

import (
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"photoPlugIn/config"
	"photoPlugIn/dbMethod"
	us "photoPlugIn/utils"
	"strings"
)

var FILE_TYPE_LIST = []string{"jpg", "jpeg"}

//处理目录中的图像文件

type sdirList struct {
	ParentId int64
	Name     string
	Url      string
}

type sphotoList struct {
	FileName string
	MD5      string
	ParentId string
	Source   string
}

//根据拓展名判断文件类型
func ifTZM(fileInfo os.FileInfo) bool {

	FileName := fileInfo.Name()
	filetzm := filepath.Ext(FileName)
	if filetzm == "" {
		return false
	}
	filetzm = strings.ToLower(filetzm[1:])
	for _, t := range FILE_TYPE_LIST {
		if t == filetzm {
			return true
		}
	}
	return false
}

func GetFolderFile() {

	sdirs := []sdirList{}
	//将photo的目录添加到需要扫描的数组中
	sdirs = append(sdirs, sdirList{ParentId: 0, Url: config.CONFIG.FOLDERDir})
	var parentid int64
	for len(sdirs) != 0 { //判断文件夹列表内是否有数据
		sdir := sdirs[0]        //获取第一个数据
		sdirs = sdirs[1:]       //将获取的数据清除
		parentid = 0            //初始化父ID
		if sdir.ParentId == 0 { //如果父ID为0，表示第一次循环,查找的是照片的根目录
			parentid = 1 //将父ID设置为1
		} else { //否则 数据库中查询当前的父ID，与文件夹名称， 判断数据中是否存在
			findVlaue := dbmethod.PhotoDirFind(sdir.ParentId, sdir.Name)
			fmt.Println("findVlaue", findVlaue)
			if findVlaue.Id == 0 {
				// fmt.Println("findVlaue空,插入数值")
				//不存在，将文件夹插入到数据库
				parentid = dbmethod.PhotoDirInsert(sdir.ParentId, sdir.Name)
			} else {
				// fmt.Println("findVlaue非空")
				//存在，将父id取出，待用。
				parentid = int64(findVlaue.Id)
			}
		}
		//判断获取的文件夹后面是否有'/'
		if sdir.Url[len(sdir.Url)-1:] != string(os.PathSeparator) {
			//如果没有，添加'/'
			sdir.Url = sdir.Url + string(os.PathSeparator)
		}
		files, _ := ioutil.ReadDir(sdir.Url) //获取目录内的文件和文件夹
		fmt.Println("file:", files)
		//迭代获取到的内容
		for _, f := range files {
			// fmt.Println("f:", f)
			//判断是否为文件夹
			if f.IsDir() {
				//获取绝对路径
				dirtmp, _ := filepath.Abs(sdir.Url + f.Name())
				//将文件夹添加到待处理的列表内
				sdirs = append(sdirs, sdirList{ParentId: parentid, Url: dirtmp, Name: f.Name()})
			} else {
				//过滤文件类型
				if !(ifTZM(f)) {
					continue
				}
				//转换为绝对路径
				fileUrl, _ := filepath.Abs(sdir.Url + f.Name())
				//计算MD5
				fileMd5, err := us.GetFileMd5(fileUrl)
				us.CheckErr(err)
				//查找数据库中是否有记录，有的话跳过
				findPhotoVlaue := dbmethod.PhotoListFind(parentid, fileMd5, f.Name())
				if findPhotoVlaue.Id != 0 {
					IsPhotoInCahce(fileMd5, sdir.Url+f.Name())
					continue
				}
				// 没有记录插入数据
				_ = dbmethod.PhotoListInsert(parentid, f.Name(), fileMd5)
				//判断是否存在临时文件
				IsPhotoInCahce(fileMd5, sdir.Url+f.Name())

			}
		}

	}
}
